home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 45
/
Aminet 45 (2001)(GTI - Schatztruhe)[!][Oct 2001].iso
/
Aminet
/
gfx
/
x11
/
x3270_3_2_16.lha
/
amiga_src
/
menubar.c
< prev
next >
Wrap
C/C++ Source or Header
|
2009-02-26
|
45KB
|
1,669 lines
/*
* Copyright 1993, 1994, 1995, 1996, 1999, 2000 by Paul Mattes.
* Permission to use, copy, modify, and distribute this software and its
* documentation for any purpose and without fee is hereby granted,
* provided that the above copyright notice appear in all copies and that
* both that copyright notice and this permission notice appear in
* supporting documentation.
*/
/*
* menubar.c
* This module handles the menu bar.
*/
#include "globals.h"
#if defined(X3270_MENUS) /*[*/
#include <X11/StringDefs.h>
#include <X11/Xaw/Command.h>
#include <X11/Xaw/MenuButton.h>
#include <X11/Xaw/Dialog.h>
#include "Husk.h"
#include "CmplxMenu.h"
#include "CmeBSB.h"
#include "CmeLine.h"
#include "appres.h"
#include "objects.h"
#include "resources.h"
#include "actionsc.h"
#include "aboutc.h"
#include "ftc.h"
#include "hostc.h"
#include "keymapc.h"
#include "keypadc.h"
#include "kybdc.h"
#include "macrosc.h"
#include "menubarc.h"
#include "popupsc.h"
#include "printerc.h"
#include "printc.h"
#include "savec.h"
#include "screenc.h"
#include "telnetc.h"
#include "togglesc.h"
#include "utilc.h"
#include "xioc.h"
#define MACROS_MENU "macrosMenu"
extern Widget keypad_shell;
extern int linemode;
extern Boolean keypad_popped;
static struct scheme {
char *label;
char *scheme;
struct scheme *next;
} *schemes, *last_scheme;
static int scheme_count;
static Widget *scheme_widgets;
static struct charset {
char *label;
char *charset;
struct charset *next;
} *charsets, *last_charset;
static int charset_count;
static Widget *charset_widgets;
static void scheme_init(void);
static void charsets_init(void);
static void options_menu_init(Boolean regen, Position x, Position y);
static void keypad_button_init(Position x, Position y);
static void connect_menu_init(Boolean regen, Position x, Position y);
static void macros_menu_init(Boolean regen, Position x, Position y);
static void file_menu_init(Boolean regen, Dimension x, Dimension y);
static void Bye(Widget w, XtPointer client_data, XtPointer call_data);
static void menubar_in3270(Boolean in3270);
static void menubar_linemode(Boolean in_linemode);
static void menubar_connect(Boolean ignored);
#if defined(X3270_PRINTER) /*[*/
static void menubar_printer(Boolean printer_on);
#endif /*]*/
static void menubar_remodel(Boolean ignored unused);
#include "dot.bm"
#include "arrow.bm"
#include "diamond.bm"
#include "no_diamond.bm"
#include "ky.bm"
#include "null.bm"
/*
* Menu Bar
*/
static Widget menu_parent;
static Boolean menubar_buttons;
static Widget disconnect_button;
static Widget exit_button;
static Widget exit_menu;
static Widget macros_button;
static Widget ft_button;
#if defined(X3270_PRINTER) /*[*/
static Widget printer_button;
static Widget assoc_button;
static Widget lu_button;
static Widget printer_off_button;
#endif /*]*/
static Widget connect_button;
static Widget keypad_button;
static Widget linemode_button;
static Widget charmode_button;
static Widget models_option;
static Widget model_2_button;
static Widget model_3_button;
static Widget model_4_button;
static Widget model_5_button;
static Widget oversize_button;
static Widget extended_button;
static Widget m3278_button;
static Widget m3279_button;
static Widget keypad_option_button;
static Widget script_abort_button;
static Widget scheme_button;
static Widget connect_menu;
static Pixmap arrow;
Pixmap dot;
Pixmap diamond;
Pixmap no_diamond;
Pixmap null;
static int n_bye;
static void toggle_init(Widget, int, const char *, const char *);
#define TOP_MARGIN 3
#define BOTTOM_MARGIN 3
#define LEFT_MARGIN 3
#define KEY_HEIGHT 18
#define KEY_WIDTH 70
#define BORDER 1
#define SPACING 3
#define MO_OFFSET 1
#define CN_OFFSET 2
#define MENU_BORDER 2
#define MENU_MIN_WIDTH (LEFT_MARGIN + 3*(KEY_WIDTH+2*BORDER+SPACING) + \
LEFT_MARGIN + (ky_width+8) + 2*BORDER + SPACING + \
2*MENU_BORDER)
/*
* Compute the potential height of the menu bar.
*/
Dimension
menubar_qheight(Dimension container_width)
{
if (!appres.menubar || container_width < (unsigned) MENU_MIN_WIDTH)
return 0;
else
return TOP_MARGIN + KEY_HEIGHT+2*BORDER + BOTTOM_MARGIN +
2*MENU_BORDER;
}
/*
* Initialize the menu bar.
*/
void
menubar_init(Widget container, Dimension overall_width, Dimension current_width)
{
static Widget menu_bar;
static Boolean ever = False;
Boolean mb_old;
Dimension height;
if (!ever) {
scheme_init();
charsets_init();
XtRegisterGrabAction(HandleMenu_action, True,
(ButtonPressMask|ButtonReleaseMask),
GrabModeAsync, GrabModeAsync);
/* Create bitmaps. */
dot = XCreateBitmapFromData(display, root_window,
(char *) dot_bits, dot_width, dot_height);
arrow = XCreateBitmapFromData(display, root_window,
(char *) arrow_bits, arrow_width, arrow_height);
diamond = XCreateBitmapFromData(display, root_window,
(char *) diamond_bits, diamond_width, diamond_height);
no_diamond = XCreateBitmapFromData(display, root_window,
(char *) no_diamond_bits, no_diamond_width,
no_diamond_height);
null = XCreateBitmapFromData(display, root_window,
(char *) null_bits, null_width, null_height);
/* Register interest in state transtions. */
register_schange(ST_3270_MODE, menubar_in3270);
register_schange(ST_LINE_MODE, menubar_linemode);
register_schange(ST_HALF_CONNECT, menubar_connect);
register_schange(ST_CONNECT, menubar_connect);
#if defined(X3270_PRINTER) /*[*/
register_schange(ST_PRINTER, menubar_printer);
#endif /*]*/
register_schange(ST_REMODEL, menubar_remodel);
ever = True;
}
height = menubar_qheight(current_width);
mb_old = menubar_buttons;
menubar_buttons = (height != 0);
if (menubar_buttons) {
if (menu_bar == (Widget)NULL) {
/* Create the menu bar. */
menu_bar = XtVaCreateManagedWidget(
"menuBarContainer", huskWidgetClass, container,
XtNborderWidth, MENU_BORDER,
XtNwidth, overall_width - 2*MENU_BORDER,
XtNheight, height - 2*MENU_BORDER,
NULL);
} else {
/* Resize and map the menu bar. */
XtVaSetValues(menu_bar,
XtNborderWidth, MENU_BORDER,
XtNwidth, overall_width - 2*MENU_BORDER,
NULL);
XtMapWidget(menu_bar);
}
menu_parent = menu_bar;
} else if (menu_bar != (Widget)NULL) {
/* Hide the menu bar. */
XtUnmapWidget(menu_bar);
menu_parent = container;
} else
menu_parent = container;
/* "File..." menu */
file_menu_init(mb_old != menubar_buttons, LEFT_MARGIN, TOP_MARGIN);
/* "Options..." menu */
options_menu_init(mb_old != menubar_buttons,
LEFT_MARGIN + MO_OFFSET*(KEY_WIDTH+2*BORDER+SPACING),
TOP_MARGIN);
/* "Connect..." menu */
if (!appres.reconnect)
connect_menu_init(mb_old != menubar_buttons,
LEFT_MARGIN + CN_OFFSET*(KEY_WIDTH+2*BORDER+SPACING),
TOP_MARGIN);
/* "Macros..." menu */
macros_menu_init(mb_old != menubar_buttons,
LEFT_MARGIN + CN_OFFSET*(KEY_WIDTH+2*BORDER+SPACING),
TOP_MARGIN);
/* Keypad button */
keypad_button_init(
(Position) (current_width - LEFT_MARGIN - (ky_width+8) -
2*BORDER - 2*MENU_BORDER),
TOP_MARGIN);
}
/*
* External entry points
*/
/*
* Called when connected to or disconnected from a host.
*/
static void
menubar_connect(Boolean ignored unused)
{
/* Set the disconnect button sensitivity. */
if (disconnect_button != (Widget)NULL)
XtVaSetValues(disconnect_button,
XtNsensitive, PCONNECTED,
NULL);
/* Set up the exit button, either with a pullright or a callback. */
if (exit_button != (Widget)NULL) {
if (PCONNECTED) {
/* Remove the immediate callback. */
if (n_bye) {
XtRemoveCallback(exit_button, XtNcallback,
Bye, 0);
n_bye--;
}
/* Set pullright for extra confirmation. */
XtVaSetValues(exit_button,
XtNrightBitmap, arrow,
XtNmenuName, "exitMenu",
NULL);
} else {
/* Install the immediate callback. */
if (!n_bye) {
XtAddCallback(exit_button, XtNcallback,
Bye, 0);
n_bye++;
}
/* Remove the pullright. */
XtVaSetValues(exit_button,
XtNrightBitmap, NULL,
XtNmenuName, NULL,
NULL);
}
}
/* Set up the connect menu. */
if (!appres.reconnect && connect_menu != (Widget)NULL) {
if (PCONNECTED && connect_button != (Widget)NULL)
XtUnmapWidget(connect_button);
else {
connect_menu_init(True,
LEFT_MARGIN +
CN_OFFSET*(KEY_WIDTH+2*BORDER+SPACING),
TOP_MARGIN);
if (menubar_buttons)
XtMapWidget(connect_button);
}
}
/* Set up the macros menu. */
macros_menu_init(True,
LEFT_MARGIN + CN_OFFSET*(KEY_WIDTH+2*BORDER+SPACING),
TOP_MARGIN);
/* Set up the various option buttons. */
if (ft_button != (Widget)NULL)
XtVaSetValues(ft_button, XtNsensitive, IN_3270, NULL);
#if defined(X3270_PRINTER) /*[*/
if (printer_button != (Widget)NULL)
XtVaSetValues(printer_button, XtNsensitive, IN_3270,
NULL);
if (assoc_button != (Widget)NULL)
XtVaSetValues(assoc_button, XtNsensitive,
!printer_running() && IN_3270 && IN_TN3270E,
NULL);
if (lu_button != (Widget)NULL)
XtVaSetValues(lu_button, XtNsensitive,
!printer_running() && IN_3270,
NULL);
#endif /*]*/
if (linemode_button != (Widget)NULL)
XtVaSetValues(linemode_button, XtNsensitive, IN_ANSI, NULL);
if (charmode_button != (Widget)NULL)
XtVaSetValues(charmode_button, XtNsensitive, IN_ANSI, NULL);
#if defined(X3270_ANSI) /*[*/
if (appres.toggle[LINE_WRAP].w[0] != (Widget)NULL)
XtVaSetValues(appres.toggle[LINE_WRAP].w[0],
XtNsensitive, IN_ANSI,
NULL);
#endif /*]*/
if (appres.toggle[RECTANGLE_SELECT].w[0] != (Widget)NULL)
XtVaSetValues(appres.toggle[RECTANGLE_SELECT].w[0],
XtNsensitive, IN_ANSI,
NULL);
if (models_option != (Widget)NULL)
XtVaSetValues(models_option, XtNsensitive, !PCONNECTED, NULL);
if (extended_button != (Widget)NULL)
XtVaSetValues(extended_button, XtNsensitive, !PCONNECTED,
NULL);
if (m3278_button != (Widget)NULL)
XtVaSetValues(m3278_button, XtNsensitive, !PCONNECTED,
NULL);
if (m3279_button != (Widget)NULL)
XtVaSetValues(m3279_button, XtNsensitive, !PCONNECTED,
NULL);
}
#if defined(X3270_PRINTER) /*[*/
/* Called when the printer starts or stops. */
static void
menubar_printer(Boolean printer_on)
{
XtVaSetValues(assoc_button, XtNsensitive,
!printer_on && IN_3270 && IN_TN3270E,
NULL);
XtVaSetValues(lu_button, XtNsensitive,
!printer_on && IN_3270,
NULL);
XtVaSetValues(printer_off_button, XtNsensitive, printer_on, NULL);
}
#endif /*]*/
void
menubar_keypad_changed(void)
{
if (keypad_option_button != (Widget)NULL)
XtVaSetValues(keypad_option_button,
XtNleftBitmap,
appres.keypad_on || keypad_popped ? dot : None,
NULL);
}
/* Called when we switch between ANSI and 3270 modes. */
static void
menubar_in3270(Boolean in3270)
{
if (ft_button != (Widget)NULL)
XtVaSetValues(ft_button, XtNsensitive, IN_3270, NULL);
#if defined(X3270_PRINTER) /*[*/
if (printer_button != (Widget)NULL)
XtVaSetValues(printer_button, XtNsensitive, IN_3270,
NULL);
if (assoc_button != (Widget)NULL)
XtVaSetValues(assoc_button, XtNsensitive,
!printer_running() && IN_3270 && IN_TN3270E,
NULL);
if (lu_button != (Widget)NULL)
XtVaSetValues(lu_button, XtNsensitive,
!printer_running() && IN_3270,
NULL);
#endif /*]*/
if (linemode_button != (Widget)NULL)
XtVaSetValues(linemode_button,
XtNsensitive, !in3270,
XtNleftBitmap, in3270 ? no_diamond
: (linemode ? diamond : no_diamond),
NULL);
if (charmode_button != (Widget)NULL)
XtVaSetValues(charmode_button,
XtNsensitive, !in3270,
XtNleftBitmap, in3270 ? no_diamond
: (linemode ? no_diamond : diamond),
NULL);
#if defined(X3270_ANSI) /*[*/
if (appres.toggle[LINE_WRAP].w[0] != (Widget)NULL)
XtVaSetValues(appres.toggle[LINE_WRAP].w[0],
XtNsensitive, !in3270,
NULL);
#endif /*]*/
if (appres.toggle[RECTANGLE_SELECT].w[0] != (Widget)NULL)
XtVaSetValues(appres.toggle[RECTANGLE_SELECT].w[0],
XtNsensitive, !in3270,
NULL);
}
/* Called when we switch between ANSI line and character. */
static void
menubar_linemode(Boolean in_linemode)
{
if (linemode_button != (Widget)NULL)
XtVaSetValues(linemode_button,
XtNleftBitmap, in_linemode ? diamond : no_diamond,
NULL);
if (charmode_button != (Widget)NULL)
XtVaSetValues(charmode_button,
XtNleftBitmap, in_linemode ? no_diamond : diamond,
NULL);
}
/* Called to change the sensitivity of the "Abort Script" button. */
void
menubar_as_set(Boolean sensitive)
{
if (script_abort_button != (Widget)NULL)
XtVaSetValues(script_abort_button,
XtNsensitive, sensitive,
NULL);
}
/*
* "File..." menu
*/
static Widget save_shell = (Widget) NULL;
/* Called from "Exit x3270" button on "File..." menu */
static void
Bye(Widget w unused, XtPointer client_data unused, XtPointer call_data unused)
{
x3270_exit(0);
}
/* Called from the "Disconnect" button on the "File..." menu */
static void
disconnect(Widget w unused, XtPointer client_data unused,
XtPointer call_data unused)
{
host_disconnect(False);
}
/* Called from the "Abort Script" button on the "File..." menu */
static void
script_abort_callback(Widget w unused, XtPointer client_data unused,
XtPointer call_data unused)
{
abort_script();
}
/* "About x3270" popup */
static void
show_about(Widget w unused, XtPointer userdata unused,
XtPointer calldata unused)
{
popup_about();
}
/* Called from the "Save" button on the save options dialog */
static void
save_button_callback(Widget w unused, XtPointer client_data,
XtPointer call_data unused)
{
char *s;
s = XawDialogGetValueString((Widget)client_data);
if (!s || !*s)
return;
if (!save_options(s))
XtPopdown(save_shell);
}
/* Called from the "Save Options in File" button on the "File..." menu */
static void
do_save_options(Widget w unused, XtPointer client_data unused,
XtPointer call_data unused)
{
if (save_shell == NULL)
save_shell = create_form_popup("SaveOptions",
save_button_callback, (XtCallbackProc)NULL, FORM_NO_WHITE);
XtVaSetValues(XtNameToWidget(save_shell, ObjDialog),
XtNvalue, profile_name,
NULL);
popup_popup(save_shell, XtGrabExclusive);
}
#if defined(X3270_PRINTER) /*[*/
/* Callback for printer session options. */
static void
do_printer(Widget w unused, XtPointer client_data, XtPointer call_data unused)
{
if (client_data == NULL)
printer_start(CN);
else if (!strcmp(client_data, "lu"))
printer_lu_dialog();
else
printer_stop();
}
#endif /*]*/
static void
file_menu_init(Boolean regen, Dimension x, Dimension y)
{
static Widget file_menu = (Widget)NULL;
Widget w;
if (regen && (file_menu != (Widget)NULL)) {
XtDestroyWidget(file_menu);
file_menu = (Widget)NULL;
}
if (file_menu != (Widget)NULL)
return;
file_menu = XtVaCreatePopupShell(
"fileMenu", complexMenuWidgetClass, menu_parent,
menubar_buttons ? XtNlabel : NULL, NULL,
NULL);
if (!menubar_buttons)
(void) XtVaCreateManagedWidget("space", cmeLineObjectClass,
file_menu, NULL);
/* About x3270... */
w = XtVaCreateManagedWidget(
"aboutOption", cmeBSBObjectClass, file_menu,
NULL);
XtAddCallback(w, XtNcallback, show_about, NULL);
#if defined(X3270_FT) /*[*/
/* File Transfer */
if (!appres.secure) {
(void) XtCreateManagedWidget(
"space", cmeLineObjectClass, file_menu,
NULL, 0);
ft_button = XtVaCreateManagedWidget(
"ftOption", cmeBSBObjectClass, file_menu,
XtNsensitive, IN_3270,
NULL);
XtAddCallback(ft_button, XtNcallback, popup_ft, NULL);
}
#endif /*]*/
#if defined(X3270_PRINTER) /*[*/
/* Printer start/stop */
w = XtVaCreatePopupShell(
"printerMenu", complexMenuWidgetClass, menu_parent,
NULL);
assoc_button = XtVaCreateManagedWidget(
"assocButton", cmeBSBObjectClass, w,
XtNsensitive, IN_3270 && IN_TN3270E,
NULL);
XtAddCallback(assoc_button, XtNcallback, do_printer, NULL);
lu_button = XtVaCreateManagedWidget(
"luButton", cmeBSBObjectClass, w,
NULL);
XtAddCallback(lu_button, XtNcallback, do_printer, "lu");
printer_off_button = XtVaCreateManagedWidget(
"printerOffButton", cmeBSBObjectClass, w,
XtNsensitive, printer_running(),
NULL);
XtAddCallback(printer_off_button, XtNcallback, do_printer, "off");
(void) XtCreateManagedWidget(
"space", cmeLineObjectClass, file_menu,
NULL, 0);
printer_button = XtVaCreateManagedWidget(
"printerOption", cmeBSBObjectClass, file_menu,
XtNsensitive, IN_3270,
XtNrightBitmap, arrow,
XtNmenuName, "printerMenu",
NULL);
#endif /*]*/
#if defined(X3270_TRACE) /*[*/
/* Trace Data Stream
Trace X Events
Save Screen(s) in File */
(void) XtVaCreateManagedWidget(
"space", cmeLineObjectClass, file_menu,
NULL);
if (appres.debug_tracing) {
toggle_init(file_menu, DS_TRACE, "dsTraceOption", CN);
toggle_init(file_menu, EVENT_TRACE, "eventTraceOption", CN);
}
if (!appres.secure)
toggle_init(file_menu, SCREEN_TRACE, "screenTraceOption", CN);
#endif /*]*/
/* Print Screen Text */
(void) XtVaCreateManagedWidget(
"space", cmeLineObjectClass, file_menu,
NULL);
w = XtVaCreateManagedWidget(
"printTextOption", cmeBSBObjectClass, file_menu,
NULL);
XtAddCallback(w, XtNcallback, print_text_option, NULL);
/* Print Window Bitmap */
w = XtVaCreateManagedWidget(
"printWindowOption", cmeBSBObjectClass, file_menu,
NULL);
XtAddCallback(w, XtNcallback, print_window_option, NULL);
if (!appres.secure) {
/* Save Options */
(void) XtVaCreateManagedWidget(
"space", cmeLineObjectClass, file_menu,
NULL);
w = XtVaCreateManagedWidget(
"saveOption", cmeBSBObjectClass, file_menu,
NULL);
XtAddCallback(w, XtNcallback, do_save_options, NULL);
/* Execute an action */
(void) XtVaCreateManagedWidget(
"space", cmeLineObjectClass, file_menu,
NULL);
w = XtVaCreateManagedWidget(
"executeActionOption", cmeBSBObjectClass, file_menu,
NULL);
XtAddCallback(w, XtNcallback, execute_action_option, NULL);
}
/* Abort script */
(void) XtVaCreateManagedWidget(
"space", cmeLineObjectClass, file_menu,
NULL);
script_abort_button = XtVaCreateManagedWidget(
"abortScriptOption", cmeBSBObjectClass, file_menu,
XtNsensitive, sms_active(),
NULL);
XtAddCallback(script_abort_button, XtNcallback, script_abort_callback,
0);
/* Disconnect */
(void) XtVaCreateManagedWidget(
"space", cmeLineObjectClass, file_menu,
NULL);
disconnect_button = XtVaCreateManagedWidget(
"disconnectOption", cmeBSBObjectClass, file_menu,
XtNsensitive, PCONNECTED,
NULL);
XtAddCallback(disconnect_button, XtNcallback, disconnect, 0);
/* Exit x3270 */
if (exit_menu != (Widget)NULL)
XtDestroyWidget(exit_menu);
exit_menu = XtVaCreatePopupShell(
"exitMenu", complexMenuWidgetClass, menu_parent,
NULL);
w = XtVaCreateManagedWidget(
"exitReallyOption", cmeBSBObjectClass, exit_menu,
NULL);
XtAddCallback(w, XtNcallback, Bye, 0);
exit_button = XtVaCreateManagedWidget(
"exitOption", cmeBSBObjectClass, file_menu,
NULL);
XtAddCallback(exit_button, XtNcallback, Bye, 0);
n_bye = 1;
/* File... */
if (menubar_buttons) {
w = XtVaCreateManagedWidget(
"fileMenuButton", menuButtonWidgetClass, menu_parent,
XtNx, x,
XtNy, y,
XtNwidth, KEY_WIDTH,
XtNheight, KEY_HEIGHT,
XtNmenuName, "fileMenu",
NULL);
}
}
/*
* "Connect..." menu
*/
static Widget connect_shell = NULL;
/* Called from each button on the "Connect..." menu */
static void
host_connect_callback(Widget w unused, XtPointer client_data,
XtPointer call_data unused)
{
(void) host_connect(client_data);
}
/* Called from the lone "Connect" button on the connect dialog */
static void
connect_button_callback(Widget w unused, XtPointer client_data,
XtPointer call_data unused)
{
char *s;
s = XawDialogGetValueString((Widget)client_data);
if (!s || !*s)
return;
if (!host_connect(s))
XtPopdown(connect_shell);
}
/* Called from the "Other..." button on the "Connect..." menu */
static void
do_connect_popup(Widget w unused, XtPointer client_data unused,
XtPointer call_data unused)
{
if (connect_shell == NULL)
connect_shell = create_form_popup("Connect",
connect_button_callback, (XtCallbackProc)NULL, FORM_NO_CC);
popup_popup(connect_shell, XtGrabExclusive);
}
/*
* Initialize the "Connect..." menu
*/
static void
connect_menu_init(Boolean regen, Position x, Position y)
{
Widget w;
int n_hosts = 0;
Boolean any_hosts = False;
struct host *h;
Boolean need_line = False;
int n_primary = 0;
int n_recent = 0;
if (regen && (connect_menu != (Widget)NULL)) {
XtDestroyWidget(connect_menu);
connect_menu = (Widget)NULL;
if (connect_button != (Widget)NULL) {
XtDestroyWidget(connect_button);
connect_button = (Widget)NULL;
}
}
if (connect_menu != (Widget)NULL)
return;
/* Create the menu */
connect_menu = XtVaCreatePopupShell(
"hostMenu", complexMenuWidgetClass, menu_parent,
menubar_buttons ? XtNlabel : NULL, NULL,
NULL);
if (!menubar_buttons)
need_line = True;
/* Walk the host list from the file to produce the host menu */
for (h = hosts; h; h = h->next) {
switch (h->entry_type) {
case ALIAS:
continue;
case PRIMARY:
/*
* If there's already a 'recent' entry with the same
* name, skip this one.
*/
{
struct host *j;
for (j = hosts;
j != (struct host *)NULL;
j = j->next) {
if (j->entry_type != RECENT) {
j = (struct host *)NULL;
break;
}
if (!strcmp(j->name, h->name))
break;
}
if (j != (struct host *)NULL)
continue;
}
n_primary++;
break;
case RECENT:
n_recent++;
break;
}
if ((need_line && !any_hosts) ||
(n_recent > 0 && n_primary == 1)) {
(void) XtVaCreateManagedWidget("space",
cmeLineObjectClass, connect_menu, NULL);
}
any_hosts = True;
w = XtVaCreateManagedWidget(
h->name, cmeBSBObjectClass, connect_menu,
NULL);
XtAddCallback(w, XtNcallback, host_connect_callback,
XtNewString(h->name));
n_hosts++;
}
if (any_hosts)
need_line = True;
/* Add an "Other..." button at the bottom */
if (!any_hosts || !appres.no_other) {
if (need_line)
(void) XtVaCreateManagedWidget("space",
cmeLineObjectClass,
connect_menu, NULL);
w = XtVaCreateManagedWidget(
"otherHostOption", cmeBSBObjectClass, connect_menu,
NULL);
XtAddCallback(w, XtNcallback, do_connect_popup, NULL);
}
/* Add the "Connect..." button itself to the menu_parent. */
if (menubar_buttons) {
if (n_hosts) {
/* Connect button pops up a menu. */
connect_button = XtVaCreateManagedWidget(
"connectMenuButton", menuButtonWidgetClass,
menu_parent,
XtNx, x,
XtNy, y,
XtNwidth, KEY_WIDTH,
XtNheight, KEY_HEIGHT,
XtNmenuName, "hostMenu",
XtNmappedWhenManaged, !PCONNECTED,
NULL);
} else {
/* Connect button pops up a dialog. */
connect_button = XtVaCreateManagedWidget(
"connectMenuButton", commandWidgetClass,
menu_parent,
XtNx, x,
XtNy, y,
XtNwidth, KEY_WIDTH,
XtNheight, KEY_HEIGHT,
XtNmappedWhenManaged, !PCONNECTED,
NULL);
XtAddCallback(connect_button, XtNcallback,
do_connect_popup, NULL);
}
}
}
/*
* Callback for macros
*/
static void
do_macro(Widget w unused, XtPointer client_data, XtPointer call_data unused)
{
macro_command((struct macro_def *)client_data);
}
/*
* Initialize the "Macros..." menu
*/
static void
macros_menu_init(Boolean regen, Position x, Position y)
{
static Widget macros_menu;
Widget w;
struct macro_def *m;
Boolean any = False;
if (regen && (macros_menu != (Widget)NULL)) {
XtDestroyWidget(macros_menu);
macros_menu = (Widget)NULL;
if (macros_button != (Widget)NULL) {
XtDestroyWidget(macros_button);
macros_button = (Widget)NULL;
}
}
if (macros_menu != (Widget)NULL || !PCONNECTED)
return;
/* Walk the list */
macros_init(); /* possibly different for each host */
for (m = macro_defs; m; m = m->next) {
if (!any) {
/* Create the menu */
macros_menu = XtVaCreatePopupShell(
MACROS_MENU, complexMenuWidgetClass, menu_parent,
menubar_buttons ? XtNlabel : NULL, NULL,
NULL);
if (!menubar_buttons)
(void) XtVaCreateManagedWidget("space",
cmeLineObjectClass, macros_menu, NULL);
}
w = XtVaCreateManagedWidget(
m->name, cmeBSBObjectClass, macros_menu,
NULL);
XtAddCallback(w, XtNcallback, do_macro, (XtPointer)m);
any = True;
}
/* Add the "Macros..." button itself to the menu_parent */
if (any && menubar_buttons)
macros_button = XtVaCreateManagedWidget(
"macrosMenuButton", menuButtonWidgetClass,
menu_parent,
XtNx, x,
XtNy, y,
XtNwidth, KEY_WIDTH,
XtNheight, KEY_HEIGHT,
XtNmenuName, MACROS_MENU,
NULL);
}
/* Called toggle the keypad */
static void
toggle_keypad(Widget w unused, XtPointer client_data unused,
XtPointer call_data unused)
{
switch (kp_placement) {
case kp_integral:
screen_showikeypad(appres.keypad_on = !appres.keypad_on);
break;
case kp_left:
case kp_right:
case kp_bottom:
keypad_popup_init();
if (keypad_popped)
XtPopdown(keypad_shell);
else
popup_popup(keypad_shell, XtGrabNone);
break;
}
menubar_keypad_changed();
keypad_changed = True;
}
static void
keypad_button_init(Position x, Position y)
{
if (!menubar_buttons)
return;
if (keypad_button == (Widget)NULL) {
Pixmap pixmap;
pixmap = XCreateBitmapFromData(display, root_window,
(char *) ky_bits, ky_width, ky_height);
keypad_button = XtVaCreateManagedWidget(
"keypadButton", commandWidgetClass, menu_parent,
XtNbitmap, pixmap,
XtNx, x,
XtNy, y,
XtNwidth, ky_width+8,
XtNheight, KEY_HEIGHT,
NULL);
XtAddCallback(keypad_button, XtNcallback,
toggle_keypad, NULL);
} else {
XtVaSetValues(keypad_button, XtNx, x, NULL);
}
}
void
menubar_resize(Dimension width)
{
keypad_button_init(
(Position) (width - LEFT_MARGIN - (ky_width+8) - 2*BORDER),
TOP_MARGIN);
}
/*
* "Options..." menu
*/
static void
toggle_callback(Widget w, XtPointer userdata, XtPointer calldata unused)
{
struct toggle *t = (struct toggle *) userdata;
/*
* If this is a two-button radio group, rather than a simple toggle,
* there is nothing to do if they are clicking on the current value.
*
* t->w[0] is the "toggle true" button; t->w[1] is "toggle false".
*/
if (t->w[1] != 0 && w == t->w[!t->value])
return;
do_toggle(t - appres.toggle);
}
static Widget oversize_shell = NULL;
/* Called from the "Change" button on the oversize dialog */
static void
oversize_button_callback(Widget w unused, XtPointer client_data,
XtPointer call_data unused)
{
char *s;
int ovc, ovr;
char junk;
s = XawDialogGetValueString((Widget)client_data);
if (!s || !*s)
return;
if (sscanf(s, "%dx%d%c", &ovc, &ovr, &junk) == 2) {
XtPopdown(oversize_shell);
screen_change_model(model_num, ovc, ovr);
} else
popup_an_error("Illegal size: %s", s);
}
/* Called from the "Oversize..." button on the "Models..." menu */
static void
do_oversize_popup(Widget w unused, XtPointer client_data unused,
XtPointer call_data unused)
{
if (oversize_shell == NULL)
oversize_shell = create_form_popup("Oversize",
oversize_button_callback, (XtCallbackProc)NULL,
FORM_NO_WHITE);
popup_popup(oversize_shell, XtGrabExclusive);
}
/* Init a toggle, menu-wise */
static void
toggle_init(Widget menu, int ix, const char *name1, const char *name2)
{
struct toggle *t = &appres.toggle[ix];
t->label[0] = name1;
t->label[1] = name2;
t->w[0] = XtVaCreateManagedWidget(
name1, cmeBSBObjectClass, menu,
XtNleftBitmap,
t->value ? (name2 ? diamond : dot) : (name2 ? no_diamond : None),
NULL);
XtAddCallback(t->w[0], XtNcallback, toggle_callback, (XtPointer) t);
if (name2 != NULL) {
t->w[1] = XtVaCreateManagedWidget(
name2, cmeBSBObjectClass, menu,
XtNleftBitmap, t->value ? no_diamond : diamond,
NULL);
XtAddCallback(t->w[1], XtNcallback, toggle_callback,
(XtPointer) t);
} else
t->w[1] = NULL;
}
static Widget *font_widgets;
static Widget other_font;
static Widget font_shell = NULL;
static void
do_newfont(Widget w unused, XtPointer userdata, XtPointer calldata unused)
{
screen_newfont((char *)userdata, True);
}
/* Called from the "Select Font" button on the font dialog */
static void
font_button_callback(Widget w, XtPointer client_data,
XtPointer call_data unused)
{
char *s;
s = XawDialogGetValueString((Widget)client_data);
if (!s || !*s)
return;
XtPopdown(font_shell);
do_newfont(w, s, PN);
}
static void
do_otherfont(Widget w unused, XtPointer userdata unused,
XtPointer calldata unused)
{
if (font_shell == NULL)
font_shell = create_form_popup("Font", font_button_callback,
(XtCallbackProc)NULL,
FORM_NO_CC);
popup_popup(font_shell, XtGrabExclusive);
}
/* Initialze the color scheme list. */
static void
scheme_init(void)
{
char *cm;
char *label;
char *scheme;
struct scheme *s;
cm = get_resource(ResSchemeList);
if (cm == CN)
return;
cm = XtNewString(cm);
scheme_count = 0;
while (split_dresource(&cm, &label, &scheme) == 1) {
s = (struct scheme *)XtMalloc(sizeof(struct scheme));
s->label = label;
s->scheme = scheme;
s->next = (struct scheme *)NULL;
if (last_scheme != (struct scheme *)NULL)
last_scheme->next = s;
else
schemes = s;
last_scheme = s;
scheme_count++;
}
}
static void
do_newscheme(Widget w unused, XtPointer userdata, XtPointer calldata unused)
{
screen_newscheme((char *)userdata);
}
/* Initialze the character set list. */
static void
charsets_init(void)
{
char *cm;
char *label;
char *charset;
struct charset *s;
cm = get_resource(ResCharsetList);
if (cm == CN)
return;
cm = XtNewString(cm);
charset_count = 0;
while (split_dresource(&cm, &label, &charset) == 1) {
s = (struct charset *)XtMalloc(sizeof(struct charset));
s->label = label;
s->charset = charset;
s->next = (struct charset *)NULL;
if (last_charset != (struct charset *)NULL)
last_charset->next = s;
else
charsets = s;
last_charset = s;
charset_count++;
}
}
static void
do_newcharset(Widget w unused, XtPointer userdata, XtPointer calldata unused)
{
struct charset *s;
int i;
/* Change the character set. */
screen_newcharset((char *)userdata);
/* Update the menu. */
for (i = 0, s = charsets; i < charset_count; i++, s = s->next)
XtVaSetValues(charset_widgets[i],
XtNleftBitmap,
((appres.charset == CN) ||
strcmp(appres.charset, s->charset)) ?
no_diamond : diamond,
NULL);
}
static Widget keymap_shell = NULL;
/* Called from the "Set Keymap" button on the keymap dialog */
static void
keymap_button_callback(Widget w unused, XtPointer client_data,
XtPointer call_data unused)
{
char *s;
s = XawDialogGetValueString((Widget)client_data);
if (s != CN && !*s)
s = CN;
XtPopdown(keymap_shell);
keymap_init(s);
}
/* Callback from the "Keymap" menu option */
static void
do_keymap(Widget w unused, XtPointer userdata unused, XtPointer calldata unused)
{
if (keymap_shell == NULL)
keymap_shell = create_form_popup("Keymap",
keymap_button_callback, (XtCallbackProc)NULL,
FORM_NO_WHITE);
popup_popup(keymap_shell, XtGrabExclusive);
}
/* Called to change telnet modes */
static void
linemode_callback(Widget w unused, XtPointer client_data unused, XtPointer call_data unused)
{
net_linemode();
}
static void
charmode_callback(Widget w unused, XtPointer client_data unused,
XtPointer call_data unused)
{
net_charmode();
}
/* Called to change models */
static void
change_model_callback(Widget w, XtPointer client_data,
XtPointer call_data unused)
{
int m;
m = atoi(client_data);
switch (model_num) {
case 2:
XtVaSetValues(model_2_button, XtNleftBitmap, no_diamond, NULL);
break;
case 3:
XtVaSetValues(model_3_button, XtNleftBitmap, no_diamond, NULL);
break;
case 4:
XtVaSetValues(model_4_button, XtNleftBitmap, no_diamond, NULL);
break;
case 5:
XtVaSetValues(model_5_button, XtNleftBitmap, no_diamond, NULL);
break;
}
XtVaSetValues(w, XtNleftBitmap, diamond, NULL);
screen_change_model(m, 0, 0);
}
/* Called to when model changes outside our control */
static void
menubar_remodel(Boolean ignored unused)
{
XtVaSetValues(model_2_button, XtNleftBitmap,
(model_num == 2)? diamond: no_diamond, NULL);
XtVaSetValues(model_3_button, XtNleftBitmap,
(model_num == 3)? diamond: no_diamond, NULL);
XtVaSetValues(model_4_button, XtNleftBitmap,
(model_num == 4)? diamond: no_diamond, NULL);
XtVaSetValues(model_5_button, XtNleftBitmap,
(model_num == 5)? diamond: no_diamond, NULL);
}
/* Called to change emulation modes */
static void
toggle_extended(Widget w unused, XtPointer client_data unused,
XtPointer call_data unused)
{
appres.extended = !appres.extended;
XtVaSetValues(extended_button, XtNleftBitmap,
appres.extended ? dot : (Pixmap)NULL,
NULL);
XtVaSetValues(oversize_button, XtNsensitive, appres.extended, NULL);
if (!appres.extended)
screen_change_model(model_num, 0, 0);
screen_extended(appres.extended);
}
static void
toggle_m3279(Widget w, XtPointer client_data unused, XtPointer call_data unused)
{
if (w == m3278_button)
appres.m3279 = False;
else if (w == m3279_button)
appres.m3279 = True;
else
return;
XtVaSetValues(m3278_button, XtNleftBitmap,
appres.m3279 ? no_diamond : diamond,
NULL);
XtVaSetValues(m3279_button, XtNleftBitmap,
appres.m3279 ? diamond : no_diamond,
NULL);
#if defined(RESTRICT_3279) /*[*/
XtVaSetValues(model_4_button, XtNsensitive, !appres.m3279, NULL);
XtVaSetValues(model_5_button, XtNsensitive, !appres.m3279, NULL);
if (model_num == 4 || model_num == 5)
screen_change_model(3, 0, 0);
#endif /*]*/
if (scheme_button != (Widget)NULL)
XtVaSetValues(scheme_button, XtNsensitive, appres.m3279, NULL);
screen_m3279(appres.m3279);
}
static void
options_menu_init(Boolean regen, Position x, Position y)
{
static Widget options_menu;
Widget t, w;
struct font_list *f;
struct scheme *s;
int ix;
if (regen && (options_menu != (Widget)NULL)) {
XtDestroyWidget(options_menu);
options_menu = (Widget)NULL;
}
if (options_menu != (Widget)NULL) {
/* Set the current font. */
for (f = font_list, ix = 0; f; f = f->next, ix++) {
XtVaSetValues(font_widgets[ix], XtNleftBitmap,
!strcmp(efontname, f->font) ?
diamond : no_diamond,
NULL);
}
/* Set the current color scheme. */
s = schemes;
for (ix = 0, s = schemes;
ix < scheme_count;
ix++, s = s->next) {
XtVaSetValues(scheme_widgets[ix], XtNleftBitmap,
!strcmp(appres.color_scheme, s->scheme) ?
diamond : no_diamond,
NULL);
}
return;
}
/* Create the shell */
options_menu = XtVaCreatePopupShell(
"optionsMenu", complexMenuWidgetClass, menu_parent,
menubar_buttons ? XtNlabel : NULL, NULL,
NULL);
if (!menubar_buttons)
(void) XtVaCreateManagedWidget("space", cmeLineObjectClass,
options_menu, NULL);
/* Create the "toggles" pullright */
t = XtVaCreatePopupShell(
"togglesMenu", complexMenuWidgetClass, menu_parent,
NULL);
if (!menubar_buttons) {
keypad_option_button = XtVaCreateManagedWidget(
"keypadOption", cmeBSBObjectClass, t,
XtNleftBitmap,
appres.keypad_on || keypad_popped ? dot : None,
NULL);
XtAddCallback(keypad_option_button, XtNcallback, toggle_keypad,
PN);
(void) XtVaCreateManagedWidget("space", cmeLineObjectClass,
t, NULL);
}
toggle_init(t, MONOCASE, "monocaseOption", CN);
toggle_init(t, CURSOR_BLINK, "cursorBlinkOption", CN);
toggle_init(t, BLANK_FILL, "blankFillOption", CN);
toggle_init(t, SHOW_TIMING, "showTimingOption", CN);
toggle_init(t, CURSOR_POS, "cursorPosOption", CN);
toggle_init(t, SCROLL_BAR, "scrollBarOption", CN);
#if defined(X3270_ANSI) /*[*/
toggle_init(t, LINE_WRAP, "lineWrapOption", CN);
#endif /*]*/
toggle_init(t, MARGINED_PASTE, "marginedPasteOption", CN);
toggle_init(t, RECTANGLE_SELECT, "rectangleSelectOption", CN);
(void) XtVaCreateManagedWidget("space", cmeLineObjectClass, t, NULL);
toggle_init(t, ALT_CURSOR, "underlineCursorOption",
"blockCursorOption");
(void) XtVaCreateManagedWidget("space", cmeLineObjectClass, t, NULL);
linemode_button = XtVaCreateManagedWidget(
"lineModeOption", cmeBSBObjectClass, t,
XtNleftBitmap, linemode ? diamond : no_diamond,
XtNsensitive, IN_ANSI,
NULL);
XtAddCallback(linemode_button, XtNcallback, linemode_callback, NULL);
charmode_button = XtVaCreateManagedWidget(
"characterModeOption", cmeBSBObjectClass, t,
XtNleftBitmap, linemode ? no_diamond : diamond,
XtNsensitive, IN_ANSI,
NULL);
XtAddCallback(charmode_button, XtNcallback, charmode_callback, NULL);
if (!appres.mono) {
(void) XtVaCreateManagedWidget("space", cmeLineObjectClass, t,
NULL);
m3278_button = XtVaCreateManagedWidget(
"m3278Option", cmeBSBObjectClass, t,
XtNleftBitmap, appres.m3279 ? no_diamond : diamond,
XtNsensitive, !PCONNECTED,
NULL);
XtAddCallback(m3278_button, XtNcallback, toggle_m3279, NULL);
m3279_button = XtVaCreateManagedWidget(
"m3279Option", cmeBSBObjectClass, t,
XtNleftBitmap, appres.m3279 ? diamond : no_diamond,
XtNsensitive, !PCONNECTED,
NULL);
XtAddCallback(m3279_button, XtNcallback, toggle_m3279, NULL);
}
(void) XtVaCreateManagedWidget("space", cmeLineObjectClass, t,
NULL);
extended_button = XtVaCreateManagedWidget(
"extendedDsOption", cmeBSBObjectClass, t,
XtNleftBitmap, appres.extended ? dot : (Pixmap)NULL,
XtNsensitive, !PCONNECTED,
NULL);
XtAddCallback(extended_button, XtNcallback, toggle_extended, NULL);
(void) XtVaCreateManagedWidget(
"togglesOption", cmeBSBObjectClass, options_menu,
XtNrightBitmap, arrow,
XtNmenuName, "togglesMenu",
NULL);
(void) XtVaCreateManagedWidget(
"space", cmeLineObjectClass, options_menu,
NULL);
/* Create the "fonts" pullright */
t = XtVaCreatePopupShell(
"fontsMenu", complexMenuWidgetClass, menu_parent,
NULL);
font_widgets = (Widget *)XtCalloc(font_count, sizeof(Widget));
for (f = font_list, ix = 0; f; f = f->next, ix++) {
font_widgets[ix] = XtVaCreateManagedWidget(
f->label, cmeBSBObjectClass, t,
XtNleftBitmap,
!strcmp(efontname, f->font) ? diamond : no_diamond,
NULL);
XtAddCallback(font_widgets[ix], XtNcallback, do_newfont,
f->font);
}
if (!appres.no_other) {
other_font = XtVaCreateManagedWidget(
"otherFontOption", cmeBSBObjectClass, t,
NULL);
XtAddCallback(other_font, XtNcallback, do_otherfont, NULL);
}
(void) XtVaCreateManagedWidget(
"fontsOption", cmeBSBObjectClass, options_menu,
XtNrightBitmap, arrow,
XtNmenuName, "fontsMenu",
XtNsensitive, appres.apl_mode ? False : True,
NULL);
(void) XtVaCreateManagedWidget(
"space", cmeLineObjectClass, options_menu,
NULL);
/* Create the "models" pullright */
t = XtVaCreatePopupShell(
"modelsMenu", complexMenuWidgetClass, menu_parent,
NULL);
model_2_button = XtVaCreateManagedWidget(
"model2Option", cmeBSBObjectClass, t,
XtNleftBitmap, model_num == 2 ? diamond : no_diamond,
NULL);
XtAddCallback(model_2_button, XtNcallback, change_model_callback,
XtNewString("2"));
model_3_button = XtVaCreateManagedWidget(
"model3Option", cmeBSBObjectClass, t,
XtNleftBitmap, model_num == 3 ? diamond : no_diamond,
NULL);
XtAddCallback(model_3_button, XtNcallback, change_model_callback,
XtNewString("3"));
model_4_button = XtVaCreateManagedWidget(
"model4Option", cmeBSBObjectClass, t,
XtNleftBitmap, model_num == 4 ? diamond : no_diamond,
#if defined(RESTRICT_3279) /*[*/
XtNsensitive, !appres.m3279,
#endif /*]*/
NULL);
XtAddCallback(model_4_button, XtNcallback,
change_model_callback, XtNewString("4"));
model_5_button = XtVaCreateManagedWidget(
"model5Option", cmeBSBObjectClass, t,
XtNleftBitmap, model_num == 5 ? diamond : no_diamond,
#if defined(RESTRICT_3279) /*[*/
XtNsensitive, !appres.m3279,
#endif /*]*/
NULL);
XtAddCallback(model_5_button, XtNcallback,
change_model_callback, XtNewString("5"));
oversize_button = XtVaCreateManagedWidget(
"oversizeOption", cmeBSBObjectClass, t,
XtNsensitive, appres.extended,
NULL);
XtAddCallback(oversize_button, XtNcallback, do_oversize_popup, NULL);
models_option = XtVaCreateManagedWidget(
"modelsOption", cmeBSBObjectClass, options_menu,
XtNrightBitmap, arrow,
XtNmenuName, "modelsMenu",
XtNsensitive, !PCONNECTED,
NULL);
/* Create the "colors" pullright */
if (scheme_count) {
(void) XtVaCreateManagedWidget("space", cmeLineObjectClass,
options_menu,
NULL);
scheme_widgets = (Widget *)XtCalloc(scheme_count,
sizeof(Widget));
t = XtVaCreatePopupShell(
"colorsMenu", complexMenuWidgetClass, menu_parent,
NULL);
s = schemes;
for (ix = 0, s = schemes; ix < scheme_count; ix++, s = s->next) {
scheme_widgets[ix] = XtVaCreateManagedWidget(
s->label, cmeBSBObjectClass, t,
XtNleftBitmap,
!strcmp(appres.color_scheme, s->scheme) ?
diamond : no_diamond,
NULL);
XtAddCallback(scheme_widgets[ix], XtNcallback,
do_newscheme, s->scheme);
}
scheme_button = XtVaCreateManagedWidget(
"colorsOption", cmeBSBObjectClass, options_menu,
XtNrightBitmap, arrow,
XtNmenuName, "colorsMenu",
XtNsensitive, appres.m3279,
NULL);
}
/* Create the "character set" pullright */
if (charset_count) {
struct charset *cs;
(void) XtVaCreateManagedWidget("space", cmeLineObjectClass,
options_menu,
NULL);
charset_widgets = (Widget *)XtCalloc(charset_count,
sizeof(Widget));
t = XtVaCreatePopupShell(
"charsetMenu", complexMenuWidgetClass, menu_parent,
NULL);
for (ix = 0, cs = charsets;
ix < charset_count;
ix++, cs = cs->next) {
charset_widgets[ix] = XtVaCreateManagedWidget(
cs->label, cmeBSBObjectClass, t,
XtNleftBitmap,
((appres.charset == CN) ||
strcmp(appres.charset, cs->charset)) ?
no_diamond : diamond,
NULL);
XtAddCallback(charset_widgets[ix], XtNcallback,
do_newcharset, cs->charset);
}
(void) XtVaCreateManagedWidget(
"charsetOption", cmeBSBObjectClass, options_menu,
XtNrightBitmap, arrow,
XtNmenuName, "charsetMenu",
NULL);
}
/* Create the "keymap" option */
if (!appres.no_other) {
(void) XtVaCreateManagedWidget("space", cmeLineObjectClass,
options_menu,
NULL);
w = XtVaCreateManagedWidget(
"keymapOption", cmeBSBObjectClass, options_menu,
NULL);
XtAddCallback(w, XtNcallback, do_keymap, NULL);
}
/* Create the "display keymap" option */
(void) XtVaCreateManagedWidget("space", cmeLineObjectClass,
options_menu,
NULL);
w = XtVaCreateManagedWidget(
"keymapDisplayOption", cmeBSBObjectClass, options_menu,
NULL);
XtAddCallback(w, XtNcallback, do_keymap_display, NULL);
if (menubar_buttons) {
(void) XtVaCreateManagedWidget(
"optionsMenuButton", menuButtonWidgetClass, menu_parent,
XtNx, x,
XtNy, y,
XtNwidth, KEY_WIDTH,
XtNheight, KEY_HEIGHT,
XtNmenuName, "optionsMenu",
NULL);
keypad_option_button = NULL;
}
}
/*
* Change a menu checkmark
*/
void
menubar_retoggle(struct toggle *t)
{
XtVaSetValues(t->w[0],
XtNleftBitmap, t->value ? (t->w[1] ? diamond : dot) : None,
NULL);
if (t->w[1] != NULL)
XtVaSetValues(t->w[1],
XtNleftBitmap, t->value ? no_diamond : diamond,
NULL);
}
void
HandleMenu_action(Widget w unused, XEvent *event, String *params,
Cardinal *num_params)
{
String p;
action_debug(HandleMenu_action, event, params, num_params);
if (check_usage(HandleMenu_action, *num_params, 1, 2) < 0)
return;
if (!CONNECTED || *num_params == 1)
p = params[0];
else
p = params[1];
if (!XtNameToWidget(menu_parent, p)) {
if (strcmp(p, MACROS_MENU))
popup_an_error("%s: cannot find menu %s",
action_name(HandleMenu_action), p);
return;
}
XtCallActionProc(menu_parent, "XawPositionComplexMenu", event, &p, 1);
XtCallActionProc(menu_parent, "MenuPopup", event, &p, 1);
}
#endif /*]*/